//
//  ZLLDataTools.m
//  练习
//
//  Created by 张令林 on 16/7/19.
//  Copyright © 2016年 itcast. All rights reserved.
//

#import "DataManager.h"

@implementation DataManager
#pragma mark - 1、通过键值对的方式存储
+ (void)saveDataWithBlock:(void (^)(NSUserDefaults *))saveDataBlock
{
	//获取单例对象  NSUserDefaults
	//快速做键值对存储,不需要指定文件名(默认为bundleid+.plist) 和路径
	NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
	/*
	 使用参数block，block里面填写需要保存的数据，使用的时候格式如下
	 例如要存储两条数据
		[userDefault setObject:@"abc" forKey:@"key1"];
		[userDefault setBool:YES forKey:@"isOpen"];
	 */
	saveDataBlock(userDefault);
	// 立即写入（这个方法可以不写，不过最好还是写上）
	[userDefault synchronize];
}
+ (void)loadDataWithBlock:(void (^)(NSUserDefaults *))loadDataBlock
{
	//2、取键值，获取单例对象
	NSUserDefaults* userDefault = [NSUserDefaults standardUserDefaults];
	/*
	 block中写要得到的数据，参照下面的进行编写
	 NSString* str = [userDefault objectForKey:@"isOpen"];
	 */
	loadDataBlock(userDefault);
}
#pragma mark - 2、通过plist文件的方式进行存储
+ (void)saveDataWithPlist:(NSString *)plistName andBlock:(void (^)(NSString *))pathBlock
{
	/*
	 NSSearchPathDirectory directory 搜索哪一个文件夹
	 NSSearchPathDomainMask domainMask 在哪搜索
	 BOOL expandTilde 路径是否展开(一定传yes,否则不能获取正确的目录)
	 */
	NSString* docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
	// 文件路径
	NSString* filePath = [docPath stringByAppendingPathComponent:plistName];
	/*
	 存储数据的block
	 使用示例：
		NSDictionary* dict = @{ @"key" : @"value" };
	    [dict writeToFile:filePath atomically:YES];
		atomically 线程同步的 一般情况下,99% 都是yes
	 */
	pathBlock(filePath);
}
+ (NSArray *)loadDataWithPlist:(NSString *)plistName
{
	// 拼接文件路径
	NSString* docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
	NSString* filePath = [docPath stringByAppendingPathComponent:plistName];
	//从文件中获取内容
	NSArray* array = [NSArray arrayWithContentsOfFile:filePath];
	return array;
}
#pragma mark - 3、归档和解档的方式存储
+ (void)saveDataByCoderWithFile:(NSString *)fileName andModelData:(id)modelData
{
	/*进行归档之前还需要一步操作，选择下面两种方式中的一种即可
	 方式1、进行文档的归档、解档操作，需要在进行归档和解档操作的那个类中写如下两个方法
	 示例代码：
		// 告诉系统需要归档哪些属性
		- (void)encodeWithCoder:(NSCoder*)coder
		{
			[coder encodeObject:_name forKey:@"name1"];
			[coder encodeInteger:_age forKey:@"age"];
		}
		// 告诉系统需要解档哪些属性
		- (instancetype)initWithCoder:(NSCoder*)coder
		{
			self = [super init];
			if (self)
			{
				_name = [coder decodeObjectForKey:@"name1"];
				_age = [coder decodeIntegerForKey:@"age"];
			}
			return self;
		}
	 方式2、老师给了一个归档解档的相关类  NSObject+Coder.h  把这两个文件拷贝到项目中就不用再模型中写归档和解档的方法了
	 */
	// 拼接文件的路径,fileName的格式为：@"teacher.data"
	NSString* tempPath = NSTemporaryDirectory();
	NSString* filePath = [tempPath stringByAppendingPathComponent:fileName];
	//归档,data一般是需要归档的那个模型类的对象
	[NSKeyedArchiver archiveRootObject:modelData toFile:filePath];
}
+ (id)loadDataByCoderWithFile:(NSString *)fileName
{
	/// 拼接文件的路径,fileName的格式为：@"teacher.data"
	NSString* tempPath = NSTemporaryDirectory();
	NSString* filePath = [tempPath stringByAppendingPathComponent:fileName];
	// 解档，获取解档的数据，返回的是解档出来的模型的数据
	return [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
}
@end
